/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kwikMart.business;

import com.kwikMart.accesData.Cliente;
import com.kwikMart.accesData.DetallePedido;
import com.kwikMart.accesData.EstadoPedido;
import com.kwikMart.accesData.Pedido;
import com.kwikMart.accesData.Producto;
import com.kwikMart.utils.OperationResult;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author WIL
 */
@Stateless
public class PedidoEJB implements PedidoEJBLocal, Serializable {

    @EJB
    private InventarioEJBLocal inventarioEJB;

    @PersistenceContext(unitName = "Kwik-E-Mart-ejbPU")
    private EntityManager em;

    public void persist(Object object) {
        em.persist(object);
    }

    @Override
    public OperationResult crearPedido(Pedido pedidoCliente, List<DetallePedido> listaDetallepedido, Cliente clienteSesion, double totalCompra) {
        OperationResult resultado = new OperationResult(false);

        try {
            boolean existenciasProducto = true;

            for (DetallePedido i : listaDetallepedido) {
                existenciasProducto = validarExistencias(i.getIdProducto().getIdProducto(), i.getCantidad());
                if (existenciasProducto == false) {

                    resultado.setOk(false);
                    resultado.getErrors().add("La cantidad del producto " + i.getIdProducto().getNombreProducto().toUpperCase() + " excede las existencias actuales del producto");
                    return resultado;
                }
            }

            pedidoCliente.setIdCliente(clienteSesion);
            pedidoCliente.setDetallePedidoList(listaDetallepedido);
            pedidoCliente.setFecha(new Date());
            pedidoCliente.setIdEstadoPedido(new EstadoPedido(1));
            pedidoCliente.setTotalFactura(totalCompra);

            for (DetallePedido i : listaDetallepedido) {
                Producto pro = (Producto) em.createNamedQuery("Producto.findByIdProducto").setParameter("idProducto", i.getIdProducto().getIdProducto()).getSingleResult();
                pro.setExistencias(pro.getExistencias() - i.getCantidad());
                i.setIdPedido(pedidoCliente);
                em.merge(pro);

            }
            em.persist(pedidoCliente);
            em.flush();
            resultado.setOk(true);
            resultado.setAditionalData(pedidoCliente);
        } catch (Exception e) {
            resultado.getErrors().add("Ocurrio un error al guardar el pedido , Intente nuevamente");
        }
        return resultado;
    }

    private boolean validarExistencias(int idProducto, int cantidad) {
        boolean resultado = false;
        try {
            Producto prod = (Producto) em.createNamedQuery("Producto.findByIdProducto").setParameter("idProducto", idProducto).getSingleResult();
            if (prod != null) {
                if (prod.getExistencias() >= cantidad) {
                    resultado = true;
                }
            }
        } catch (Exception e) {
            resultado = false;
        }
        return resultado;
    }

    @Override
    public Pedido buscarPedidoId(int idPedido) {
        em.getEntityManagerFactory().getCache().evict(Pedido.class);
        em.getEntityManagerFactory().getCache().evict(DetallePedido.class);
        em.getEntityManagerFactory().getCache().evict(Cliente.class);
        
        return em.find(Pedido.class, idPedido);
    }
}
